import router from "./router";
import pinia from '@/stores'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import { useUserInfoStore } from "@/stores/user";
const userInfoStore = useUserInfoStore(pinia);
// 不用进行token检查的白名单路径数组
const whiteList = ["/login",'/','/category','/register','/topic'];
router.beforeEach(async(to, from, next) => {
       // 在显示进度条
   NProgress.start()
  const token = userInfoStore.token;
  // 如果token存在(已经登陆或前面登陆过)
  if (token) {
    // 如果请求的是登陆路由
    if (to.path === "/login") {
      // 直接跳转到根路由, 并完成进度条
      next({ path: "/" });
      NProgress.done()
    // 不是登陆路由
    }else {
      // 是否已经登陆
      const hasLogin = !!userInfoStore.userInfo.name
      if(hasLogin){//登陆了
        next()
        NProgress.done()
      }else{//如果还没有登陆
        try {
            // 异步请求获取用户信息(包含权限数据) ==> 动态注册用户的权限路由 => 当次跳转不可见
            await userInfoStore.getUserInfo()
            next(to) // 重新跳转去目标路由, 能看到动态添加的异步路由, 且不会丢失参数
            NProgress.done()
          } catch (error: any) { // 如果请求处理过程中出错
            // 重置用户信息
            userInfoStore.reset()
            // 提示错误信息
            // ElMessage.error(error.message || 'Has Error') // axios拦截器中已经有提示了
            // 跳转到登陆页面, 并携带原本要跳转的路由路径, 用于登陆成功后跳转
            next(`/login?redirect=${to.path}`)
            NProgress.done()
          }
      }
    }
  } else { // 没有token
    // 如果目标路径在白名单中(是不需要token的路径)
    if (whiteList.indexOf(to.path) !== -1) {
      // 放行
      next()
      NProgress.done()
    } else {
      // 如果没在白名单中, 跳转到登陆路由携带原目标路径
      next(`/login?redirect=${to.path}`)
      NProgress.done()
    }
  }
});
// 路由加载后
router.afterEach(() => {
	NProgress.done();
})